# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple=aarch64-apple-darwin -run-pass=regbankselect -verify-machineinstrs %s -o - | FileCheck %s

...
---
name:            select_f32
alignment:       4
legalized:       true
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $s0, $s1, $w0

    ; CHECK-LABEL: name: select_f32
    ; CHECK: liveins: $s0, $s1, $w0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s32) = COPY $s0
    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr(s32) = COPY $s1
    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:fpr(s32) = G_SELECT [[COPY]](s32), [[COPY1]], [[COPY2]]
    ; CHECK-NEXT: $s0 = COPY [[SELECT]](s32)
    ; CHECK-NEXT: RET_ReallyLR implicit $s0
    %3:_(s32) = COPY $w0
    %1:_(s32) = COPY $s0
    %2:_(s32) = COPY $s1
    %4:_(s32) = G_SELECT %3, %1, %2
    $s0 = COPY %4(s32)
    RET_ReallyLR implicit $s0

...
---
name:            select_f64
alignment:       4
legalized:       true
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $d0, $d1, $w0

    ; CHECK-LABEL: name: select_f64
    ; CHECK: liveins: $d0, $d1, $w0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d0
    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr(s64) = COPY $d1
    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:fpr(s64) = G_SELECT [[COPY]](s32), [[COPY1]], [[COPY2]]
    ; CHECK-NEXT: $d0 = COPY [[SELECT]](s64)
    ; CHECK-NEXT: RET_ReallyLR implicit $d0
    %3:_(s32) = COPY $w0
    %1:_(s64) = COPY $d0
    %2:_(s64) = COPY $d1
    %4:_(s64) = G_SELECT %3, %1, %2
    $d0 = COPY %4(s64)
    RET_ReallyLR implicit $d0

...
---
name:            two_fpr_inputs_gpr_output
alignment:       4
legalized:       true
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $d0, $d1, $w0

    ; Verify that the G_SELECT only has FPRs.
    ; The only difference between fcsel and csel are the register banks. So,
    ; if we have two FPR inputs and a GPR output, we should do a floating point
    ; select anyway. This will cost one copy for the output, but that's less
    ; than doing two to put the inputs on GPRs.

    ; CHECK-LABEL: name: two_fpr_inputs_gpr_output
    ; CHECK: liveins: $d0, $d1, $w0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d0
    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr(s64) = COPY $d1
    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:fpr(s64) = G_SELECT [[COPY]](s32), [[COPY1]], [[COPY2]]
    ; CHECK-NEXT: $x0 = COPY [[SELECT]](s64)
    ; CHECK-NEXT: RET_ReallyLR implicit $x0
    %3:_(s32) = COPY $w0
    %1:_(s64) = COPY $d0
    %2:_(s64) = COPY $d1
    %4:_(s64) = G_SELECT %3, %1, %2
    $x0 = COPY %4(s64)
    RET_ReallyLR implicit $x0

...
---
name:            one_fpr_input_fpr_output
alignment:       4
legalized:       true
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $d0, $x1, $w0

    ; Same idea as the above test. If the output is an FPR, and one of the
    ; inputs is an FPR, then it's fewer copies to just do a FCSEL.

    ; CHECK-LABEL: name: one_fpr_input_fpr_output
    ; CHECK: liveins: $d0, $x1, $w0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d0
    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr(s64) = COPY $x1
    ; CHECK-NEXT: [[COPY3:%[0-9]+]]:fpr(s64) = COPY [[COPY2]](s64)
    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:fpr(s64) = G_SELECT [[COPY]](s32), [[COPY1]], [[COPY3]]
    ; CHECK-NEXT: $d0 = COPY [[SELECT]](s64)
    ; CHECK-NEXT: RET_ReallyLR implicit $d0
    %3:_(s32) = COPY $w0
    %1:_(s64) = COPY $d0
    %2:_(s64) = COPY $x1
    %4:_(s64) = G_SELECT %3, %1, %2
    $d0 = COPY %4(s64)
    RET_ReallyLR implicit $d0

...
---
name:            one_fpr_input_gpr_output
alignment:       4
legalized:       true
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $d0, $x1, $w0

    ; Now we have more GPR registers on the G_SELECT. It's cheaper here to put
    ; everything on GPR.

    ; CHECK-LABEL: name: one_fpr_input_gpr_output
    ; CHECK: liveins: $d0, $x1, $w0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d0
    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr(s64) = COPY $x1
    ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr(s64) = COPY [[COPY1]](s64)
    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:gpr(s64) = G_SELECT [[COPY]](s32), [[COPY3]], [[COPY2]]
    ; CHECK-NEXT: $x0 = COPY [[SELECT]](s64)
    ; CHECK-NEXT: RET_ReallyLR implicit $x0
    %3:_(s32) = COPY $w0
    %1:_(s64) = COPY $d0
    %2:_(s64) = COPY $x1
    %4:_(s64) = G_SELECT %3, %1, %2
    $x0 = COPY %4(s64)
    RET_ReallyLR implicit $x0

...
---
name:            two_gpr_input_fpr_output
alignment:       4
legalized:       true
tracksRegLiveness: true
machineFunctionInfo: {}
body:             |
  bb.0:
    liveins: $x0, $x1, $w0

    ; Same as above. The G_SELECT should get all GPRS.

    ; CHECK-LABEL: name: two_gpr_input_fpr_output
    ; CHECK: liveins: $x0, $x1, $w0
    ; CHECK-NEXT: {{  $}}
    ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
    ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr(s64) = COPY $x0
    ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr(s64) = COPY $x1
    ; CHECK-NEXT: [[SELECT:%[0-9]+]]:gpr(s64) = G_SELECT [[COPY]](s32), [[COPY1]], [[COPY2]]
    ; CHECK-NEXT: $d0 = COPY [[SELECT]](s64)
    ; CHECK-NEXT: RET_ReallyLR implicit $d0
    %3:_(s32) = COPY $w0
    %1:_(s64) = COPY $x0
    %2:_(s64) = COPY $x1
    %4:_(s64) = G_SELECT %3, %1, %2
    $d0 = COPY %4(s64)
    RET_ReallyLR implicit $d0
